package visualizer.client.algorithms.sBst;

import visualizer.client.algorithms.AlgoResult;
import visualizer.client.algorithms.Algorithm;
import visualizer.client.bst.BNode;
import visualizer.client.bst.BinaryTree;

import java.util.ArrayList;
import java.util.List;

/**
 * User: DDovzhenko
 * Date: 07.01.14
 * Time: 18:25
 */
public class SBSTSearchingAlgorithm implements Algorithm {
    private BinaryTree tree;
    private List<AlgoResult> results = new ArrayList<AlgoResult>();

    @Override
    public AlgoResult performAlgorithmToStep(BinaryTree tree, int step, int inputValue) {
        return results.get(step);
    }

    @Override
    public int getStepsCount(BinaryTree binaryTree, int inputValue) {
        results.clear();
        results.add(new AlgoResult(binaryTree.copyTree(false), "Поиск узла с ключом " + inputValue + ". Выполним его скос в корень в случае удачного поиска или скос последнего посещенного узла в случае неудачного"));
        tree = binaryTree.copyTree(false);
        search(inputValue);
        results.add(new AlgoResult(tree, "Алгоритм завершен"));
        return results.size();
    }

    private void search(int value) {
        boolean isFound = SplayBSTUtils.search(tree, value, results);
        if (isFound) {
            results.add(new AlgoResult(tree.copyTree(true), "Узел найден, переместим его в корень"));
        } else {
            results.add(new AlgoResult(tree.copyTree(true), "Узел не найден, переместим последний посещенный узел в корень"));
        }
        SplayBSTUtils.splay(tree, value, results);
    }
}
